package app.sevenc.lib_compiler.processor;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.SourceVersion;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;

import app.sevenc.lib_compiler.utils.Logger;
import app.sevenc.lib_compiler.utils.TypeUtils;

/**
 * APT生成技术
 *
 * 如何debug自定义AbstractProcessor <a href="https://www.jianshu.com/p/80a14bc35000">
 * AbstractProcessor注解处理器 <a href="https://blog.csdn.net/jeasonlzy/article/details/74273851">
 * compile 'com.squareup:javapoet:1.8.0' <a href="https://github.com/square/javapoet">
 * Java AbstractProcessor实现自定义ButterKnife <a href="https://blog.csdn.net/kaifa1321/article/details/79683246">
 * <p>
 * <p>
 * 生成代码
 *
 * @author Seven-C
 * @date 2021/8/16
 */
public abstract class BaseProcessor extends AbstractProcessor {

    Filer mFiler;//生成器
    protected Logger logger;//日志
    Types types;//具体类型
    protected Elements elementUtils;//类信息
    TypeUtils typeUtils;

    /**
     * {@link ProcessingEnvironment#getElementUtils()}返回用来在元素上进行操作的某些实用工具方法的实现
     * {@link ProcessingEnvironment#getMessager()}返回用来报告错误、警报和其他通知的 Messager
     * {@link ProcessingEnvironment#getFiler()}用来创建新源、类或辅助文件的 Filer
     * {@link ProcessingEnvironment#getTypeUtils()}返回用来在类型上进行操作的某些实用工具方法的实现
     * {@link ProcessingEnvironment#getSourceVersion()}返回任何生成的源和类文件应该符合的源版本
     * {@link ProcessingEnvironment#getLocale()}返回当前语言环境；如果没有有效的语言环境，则返回 null
     * {@link ProcessingEnvironment#getOptions()}返回传递给注释处理工具的特定于 processor 的选项
     *
     * @param processingEnv
     */
    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);

        mFiler = processingEnv.getFiler();
        types = processingEnv.getTypeUtils();
        elementUtils = processingEnv.getElementUtils();
        typeUtils = new TypeUtils(types, elementUtils);
        logger = new Logger(processingEnv.getMessager());
    }

    /**
     * 声明这个注解处理器支持的java版本
     *
     * @return
     */
    @Override
    public SourceVersion getSupportedSourceVersion() {
        //返回任何生成的源和类文件应该符合的源版本。
//        return processingEnv.getSourceVersion();
        return SourceVersion.RELEASE_8;
    }

//    /**
//     * 声明当前注解处理器要处理的注解
//     * 可以用 @SupportedAnnotationTypes({"",""}) 代替会更加方便
//     *
//     * @return
//     */
//    @Override
//    public Set<String> getSupportedAnnotationTypes() {
//        Set<String> types = new HashSet<>();
//        types.add(BindApi.class.getCanonicalName());
//        types.add(Override.class.getCanonicalName());
//        return types;
//    }
}
